package com.miaocat19.config;

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

/*
 *
 * 这个类我们时为了应对高并发的问题
 * 调节tomcat的参数
 * 实现了重新设置了tomcat的参数使其实现了
 * 长连接
 * setKeepAliveTimeout
 * 也可以设置
 * setMaxKeepAliveRequests
 * 当这个长连接实现了多少个请求之后然后制动断开
 *
 *
 *   1、这个是怎么实现的呢 首先创建了Configuration中的配置类 加上Component注解使之能够 自动交给spring管理
 *   2、这个类实现 WebServerFactoryCustomizer<ConfigurableWebServerFactory>这个接口
 *   3、实现这个类的接口方法customize方法 这个方法中由有个参数 叫做ConfigurableWebServerFactory  这个类是个接口
 *   4、然后使用这个参数进行
 *   实现addConnectorCustomizers这个方法 是在这个内部进行编写  （）就是括号里面 进行编写 因为configrablewebserverfactory这个类是一个接口
 *   没法实现方法体
 *   这个括号里面进行创建 new TomcatConnectorCustomizer()这个接口
 *   然后重写这个他的方法customize
 *   实现这个方法 这个方法有个对象叫做Connector
 *   用这个对下去创建一个约定getProtocolHandler（）
 *   返回约定的对象Http11NioProtocol protocol
 *   通过这个对象进行设置长连接和超过请求之后的断开连接
 * */


/*//当Spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时，会吧此bean加载进spring容器中*/
@Component
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {

    /*//使用对应工厂类提供给我们的接口定制化我们的tomcat connector*/
    @Override
    public void customize(ConfigurableWebServerFactory configurableWebServerFactory) {
        ((TomcatServletWebServerFactory) configurableWebServerFactory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                //定制化keepalivetimeout,设置30秒内没有请求则服务端自动断开keepalive链接
                protocol.setKeepAliveTimeout(30000);
                //当客户端发送超过10000个请求则自动断开keepalive链接
                protocol.setMaxKeepAliveRequests(10000);
            }
        });
    }

}
